home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifcico / emsidat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-05-02  |  7.3 KB  |  307 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <time.h>
  6. #include "ftn.h"
  7. #include "xutil.h"
  8. #include "lutil.h"
  9. #include "emsi.h"
  10. #include "session.h"
  11. #include "config.h"
  12.  
  13. extern char *version,*reldate;
  14. extern time_t mtime2sl(time_t);
  15. extern time_t sl2mtime(time_t);
  16. extern int nodelock(faddr*);
  17.  
  18. char *mkemsidat(caller)
  19. int caller;
  20. {
  21.     time_t tt;
  22.     char cbuf[16];
  23.     char *p;
  24.     fa_list *tmp;
  25.  
  26.     p=xstrcpy("EMSI_DAT0000{EMSI}{");
  27.     for (tmp=whoami;tmp;tmp=tmp->next)
  28.     {
  29.         p=xstrcat(p,ascfnode(tmp->addr,0x1f));
  30.         if (tmp->next)
  31.             p=xstrcat(p," ");
  32.         else
  33.             p=xstrcat(p,"}");
  34.     }
  35.     p=xstrcat(p,"{");
  36.     if (emsi_local_password) p=xstrcat(p,emsi_local_password);
  37.     else if (remote)
  38.     for (tmp=pwlist;tmp;tmp=tmp->next)
  39.     if (metric(remote->addr,tmp->addr) == 0)
  40.     {
  41.         p=xstrcat(p,tmp->addr->name);
  42.         break;
  43.     }
  44.     p=xstrcat(p,"}{8N1");
  45.     if (caller)
  46.     {
  47.              if (emsi_local_lcodes & PUA) p=xstrcat(p,",PUA");
  48.         else if (emsi_local_lcodes & PUP) p=xstrcat(p,",PUP");
  49.         else if (emsi_local_lcodes & NPU) p=xstrcat(p,",NPU");
  50.     }
  51.     else
  52.     {
  53.         if (emsi_local_lcodes & HAT) p=xstrcat(p,",HAT");
  54.         if (emsi_local_lcodes & HXT) p=xstrcat(p,",HXT");
  55.         if (emsi_local_lcodes & HRQ) p=xstrcat(p,",HRQ");
  56.     }
  57.     p=xstrcat(p,"}{");
  58.     if (emsi_local_protos & DZA) p=xstrcat(p,"DZA,");
  59.     if (emsi_local_protos & ZAP) p=xstrcat(p,"ZAP,");
  60.     if (emsi_local_protos & ZMO) p=xstrcat(p,"ZMO,");
  61.     if (emsi_local_protos & JAN) p=xstrcat(p,"JAN,");
  62.     if (emsi_local_protos & HYD) p=xstrcat(p,"HYD,");
  63.     if (emsi_local_protos & KER) p=xstrcat(p,"KER,");
  64.     if (emsi_local_protos ==  0) p=xstrcat(p,"NCP,");
  65.     if (emsi_local_opts & NRQ) p=xstrcat(p,"NRQ,");
  66.     if (emsi_local_opts & ARC) p=xstrcat(p,"ARC,");
  67.     if (emsi_local_opts & XMA) p=xstrcat(p,"XMA,");
  68.     if (emsi_local_opts & FNC) p=xstrcat(p,"FNC,");
  69.     if (emsi_local_opts & CHT) p=xstrcat(p,"CHT,");
  70.     if (emsi_local_opts & SLK) p=xstrcat(p,"SLK,");
  71.     if (*(p+strlen(p)-1) == ',') *(p+strlen(p)-1) = '}';
  72.     else p=xstrcat(p,"}");
  73.     p=xstrcat(p,"{FE}{ifcico}{");
  74.     p=xstrcat(p,version);
  75.     p=xstrcat(p,"}{");
  76.     p=xstrcat(p,reldate);
  77.     p=xstrcat(p,"}{TRX#}{[");
  78.     (void)time(&tt);
  79.     sprintf(cbuf,"%08lX",mtime2sl(tt));
  80.     p=xstrcat(p,cbuf);
  81.     p=xstrcat(p,"]}{IDENT}{[");
  82.     p=xstrcat(p,name?name:"Unknown");
  83.     p=xstrcat(p,"][");
  84.     p=xstrcat(p,location?location:"Unknown");
  85.     p=xstrcat(p,"][");
  86.     p=xstrcat(p,sysop?sysop:"Unknown");
  87.     p=xstrcat(p,"][");
  88.     p=xstrcat(p,phone?phone:"-Unpublished-");
  89.     p=xstrcat(p,"][");
  90.     if (speed) sprintf(cbuf,"%ld",speed);
  91.     else strcpy(cbuf,"9600");
  92.     p=xstrcat(p,cbuf);
  93.     p=xstrcat(p,"][");
  94.     p=xstrcat(p,flags?flags:"");
  95.     p=xstrcat(p,"]}");
  96.  
  97.     sprintf(cbuf,"%04X",strlen(p+12));
  98.     memcpy(p+8,cbuf,4);
  99.     debug(10,"prepared: \"%s\"",p);
  100.     return p;
  101. }
  102.  
  103. char *sel_brace(char*);
  104. char *sel_brace(s)
  105. char *s;
  106. {
  107.     static char *save;
  108.     char *p,*q;
  109.     int i;
  110.  
  111.     if (s == NULL) s=save;
  112.     for (;*s && (*s != '{');s++);
  113.     if (*s == '\0')
  114.     {
  115.         save=s;
  116.         return NULL;
  117.     }
  118.     else s++;
  119.     for (p=s,q=s;*p;p++) switch (*p)
  120.     {
  121.     case '}':    if (*(p+1) == '}') *q++=*p++;
  122.             else
  123.             {
  124.                 *q='\0';
  125.                 save=p+1;
  126.                 goto exit;
  127.             }
  128.             break;
  129.     case '\\':    if (*(p+1) == '\\') *q++=*p++;
  130.             else
  131.             {
  132.                 sscanf(p+1,"%02x",&i);
  133.                 *q++=i;
  134.                 p+=2;
  135.             }
  136.             break;
  137.     default:    *q++=*p;
  138.             break;
  139.     }
  140. exit:
  141.     return s;
  142. }
  143.  
  144. char *sel_bracket(char*);
  145. char *sel_bracket(s)
  146. char *s;
  147. {
  148.     static char *save;
  149.     char *p,*q;
  150.     int i;
  151.  
  152.     if (s == NULL) s=save;
  153.     for (;*s && (*s != '[');s++);
  154.     if (*s == '\0')
  155.     {
  156.         save=s;
  157.         return NULL;
  158.     }
  159.     else s++;
  160.     for (p=s,q=s;*p;p++) switch (*p)
  161.     {
  162.     case ']':    if (*(p+1) == ']') *q++=*p++;
  163.             else
  164.             {
  165.                 *q='\0';
  166.                 save=p+1;
  167.                 goto exit;
  168.             }
  169.             break;
  170.     case '\\':    if (*(p+1) == '\\') *q++=*p++;
  171.             else
  172.             {
  173.                 sscanf(p+1,"%02x",&i);
  174.                 *q++=i;
  175.                 p+=2;
  176.             }
  177.             break;
  178.     default:    *q++=*p;
  179.             break;
  180.     }
  181. exit:
  182.     return s;
  183. }
  184.  
  185. int scanemsidat(buf)
  186. char *buf;
  187. {
  188.     char *p,*q;
  189.     fa_list **tmp,*tmpa;
  190.     faddr *fa;
  191.     char *mailer_prod,*mailer_name,*mailer_version,*mailer_serial;
  192.  
  193.     debug(10,"got data packet: \"%s\"",buf);
  194.  
  195.     p=sel_brace(buf);
  196.     if (strcasecmp(p,"EMSI") != 0)
  197.     {
  198.         loginf("This can never occur. Got \"%s\" instead of \"EMSI\"",p);
  199.         return 1;
  200.     }
  201.     p=sel_brace(NULL);
  202.     tidy_falist(&remote);
  203.     remote=NULL;
  204.     tmp=&remote;
  205.     for (q=strtok(p," ");q;q=strtok(NULL," "))
  206.     if ((fa=parsefnode(q)))
  207.     {
  208.         *tmp=(fa_list*)xmalloc(sizeof(fa_list));
  209.         (*tmp)->next=NULL;
  210.         (*tmp)->addr=fa;
  211.         tmp=&((*tmp)->next);
  212.     }
  213.  
  214.     for (tmpa=remote;tmpa;tmpa=tmpa->next)
  215.     {
  216.         loginf("remote  address: %s",ascfnode(tmpa->addr,0x1f));
  217.         (void)nodelock(tmpa->addr);
  218.     }
  219.  
  220.     if (emsi_remote_password) free(emsi_remote_password);
  221.     emsi_remote_password=xstrcpy(sel_brace(NULL));
  222.     loginf("remote password: %s",
  223.         emsi_remote_password?emsi_remote_password:"(none)");
  224.  
  225.     p=sel_brace(NULL);
  226.     for (q=strtok(p,",");q;q=strtok(NULL,","))
  227.     {
  228.         if (((q[0] >= '5') && (q[0] <= '8')) &&
  229.             ((toupper(q[1]) == 'N') ||
  230.              (toupper(q[1]) == 'O') ||
  231.              (toupper(q[1]) == 'E') ||
  232.              (toupper(q[1]) == 'S') ||
  233.              (toupper(q[1]) == 'M')) &&
  234.             ((q[2] == '1') || (q[2] == '2')))
  235.         {
  236.             strncpy(emsi_remote_comm,q,3);
  237.         }
  238.         else if (strcasecmp(q,"PUA") == 0) emsi_remote_lcodes |= PUA;
  239.         else if (strcasecmp(q,"PUP") == 0) emsi_remote_lcodes |= PUP;
  240.         else if (strcasecmp(q,"NPU") == 0) emsi_remote_lcodes |= NPU;
  241.         else if (strcasecmp(q,"HAT") == 0) emsi_remote_lcodes |= HAT;
  242.         else if (strcasecmp(q,"HXT") == 0) emsi_remote_lcodes |= HXT;
  243.         else if (strcasecmp(q,"HRQ") == 0) emsi_remote_lcodes |= HRQ;
  244.         else loginf("unrecognized EMSI link code: \"%s\"",q);
  245.     }
  246.  
  247.     p=sel_brace(NULL);
  248.     for (q=strtok(p,",");q;q=strtok(NULL,","))
  249.     {
  250.              if (strcasecmp(q,"DZA") == 0) emsi_remote_protos |= DZA;
  251.         else if (strcasecmp(q,"ZAP") == 0) emsi_remote_protos |= ZAP;
  252.         else if (strcasecmp(q,"ZMO") == 0) emsi_remote_protos |= ZMO;
  253.         else if (strcasecmp(q,"JAN") == 0) emsi_remote_protos |= JAN;
  254.         else if (strcasecmp(q,"HYD") == 0) emsi_remote_protos |= HYD;
  255.         else if (strcasecmp(q,"KER") == 0) emsi_remote_protos |= KER;
  256.         else if (strcasecmp(q,"NCP") == 0) emsi_remote_protos = 0;
  257.         else if (strcasecmp(q,"NRQ") == 0) emsi_remote_opts |= NRQ;
  258.         else if (strcasecmp(q,"ARC") == 0) emsi_remote_opts |= ARC;
  259.         else if (strcasecmp(q,"XMA") == 0) emsi_remote_opts |= XMA;
  260.         else if (strcasecmp(q,"FNC") == 0) emsi_remote_opts |= FNC;
  261.         else if (strcasecmp(q,"CHT") == 0) emsi_remote_opts |= CHT;
  262.         else if (strcasecmp(q,"SLK") == 0) emsi_remote_opts |= SLK;
  263.         else loginf("unrecognized EMSI proto/option code: \"%s\"",q);
  264.     }
  265.     mailer_prod=sel_brace(NULL);
  266.     mailer_name=sel_brace(NULL);
  267.     mailer_version=sel_brace(NULL);
  268.     mailer_serial=sel_brace(NULL);
  269.     loginf("remote     uses: %s [%s] version %s/%s",
  270.         mailer_name,mailer_prod,mailer_version,mailer_serial);
  271.     while ((p=sel_brace(NULL)))
  272.     if (strcasecmp(p,"IDENT") == 0)
  273.     {
  274.         p=sel_brace(NULL);
  275.         loginf("remote   system: %s",sel_bracket(p));
  276.         loginf("remote location: %s",sel_bracket(NULL));
  277.         loginf("remote operator: %s",(p=sel_bracket(NULL)));
  278.         if (remote && remote->addr)
  279.             remote->addr->name=xstrcpy(p);
  280.         loginf("remote    phone: %s",sel_bracket(NULL));
  281.         loginf("remote     baud: %s",sel_bracket(NULL));
  282.         loginf("remote    flags: %s",sel_bracket(NULL));
  283.     }
  284.     else if (strcasecmp(p,"TRX#") == 0)
  285.     {
  286.         time_t tt;
  287.         char ctt[32];
  288.  
  289.         p=sel_brace(NULL);
  290.         p=sel_bracket(p);
  291.         if (sscanf(p,"%08lx",&tt) == 1)
  292.         {
  293.             strcpy(ctt,date(sl2mtime(tt)));
  294.             loginf("remote     time: %s",ctt);
  295.         }
  296.         else
  297.             loginf("remote     TRX#: %s",p);
  298.     }
  299.     else
  300.     {
  301.         q=sel_brace(NULL);
  302.         loginf("remote tag: \"%s\" value: \"%s\"",p,q);
  303.     }
  304.  
  305.     return 0;
  306. }
  307.